import base64, pickle
from django_redis import get_redis_connection

# 封装合并购物车方法
def megre_cart(request, response, user):
    """
    调用函数需要传递如下数据
    :param request:
    :param response:
    :param user:
    :return:
    """

    # 1、获取cookie数据
    cart_cookie = request.COOKIES.get('cart_cookie')
    # 2、判断cookie是否存在
    if cart_cookie is None:
        return response
    # 3、解码
    cart_dict = pickle.loads(base64.b64decode(cart_cookie))
    #　删除完数据后可能为空字典需要进行判断
    if not cart_dict:
        return response
    # 4、将cookie数据存入到redis 注意：存入redis是，对原有数据如何处理，方案是覆盖，
    # 把cookie中的数据覆盖redis中的数据  {sku_id:{'count':2,'selected':True}}
    # 4-1拆分字典数据，分别拆分为hash数据，set数据
    # 4-2 存储hash数据
    data_dict = {}
    # 4-3 存储set数据
    data_list = []  # 这个列表中存储选中状态的sku_id
    data_list_none = []  # 这个列表中存储未选中状态的sku_id
    # 4-4 遍历cookie中的字典分别写入数据
    for sku_id, count_selected in cart_dict.items():
        # hash数据
        data_dict[sku_id] = count_selected['count']
        # set数据
        if count_selected['selected']:
            data_list.append(sku_id)
        else:
            data_list_none.append(sku_id)

    # 4-5 连接redis
    conn = get_redis_connection('carts')
    # 4-6 分别写入hash和set数据 hmset写入多个数据
    conn.hmset('sku_count_%d' % user.id, data_dict)
    # 4-7 判断不同列表
    if data_list:
        # 这列表中的数据需要添加
        conn.sadd('selected_%d' % user.id, *data_list)

    if data_list_none:
        # 这列表中的数据需要删除
        conn.srem('selected_%d' % user.id, *data_list_none)
    # 5、删除cookie数据
    response.delete_cookie('cart_cookie')
    return response